package com.fzg.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fzg.common.enums.ResponseWrapper;
import com.fzg.common.tool.HttpUtils;
import com.fzg.common.tool.ImageCodeTool;
import com.fzg.common.tool.JSONUtilsTool;
import com.fzg.entity.Gedan;
import com.fzg.mapper.GedanMapper;
import com.fzg.service.GedanService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 网易云音乐歌单 服务实现类
 * </p>
 *
 * @author fzg
 * @since 2022-12-05
 */

@Slf4j
@Service
public class GedanServiceImpl extends ServiceImpl<GedanMapper, Gedan> implements GedanService {

    @Autowired
    private GedanMapper gedanMapper;

    /**
     * 获取歌单列表
     * api接口地址：https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi
     * 项目地址：https://github.com/Binaryify/NeteaseCloudMusicApi
     * 下载下来之后
     * npm install
     * 运行 node app.js
     * 默认运行端口：3000
     */
    @Override
    public ResponseWrapper getListSongs() {
        // 推荐歌单的请求地址：http://localhost:3000/personalized?limit=
        /*
          推荐歌单
          说明 : 调用此接口 , 可获取推荐歌单

          可选参数 : limit: 取出数量 , 默认为 30 (不支持 offset)

          接口地址 : /personalized

          调用例子 : /personalized?limit=1
         */
        // 获取100个歌单
        String url = "http://localhost:3000/personalized?limit=50";
        String s = HttpUtils.sendGetRequest(url);
        log.info(s);
        // JSON字符串转JSONObject对象
        JSONObject jsonObj = JSONObject.parseObject(s);
        // JSONObject对象转map
        Map<String, Object> map = JSONUtilsTool.JSONObjectToMap(jsonObj);
        log.info(map.toString());

        log.info(map.get("code").toString());
        if (map.get("code").toString().equals("200")){
            // 200 说明获取数据成功
            Object result = map.get("result");
            log.info(result.toString());
            // 获取到了歌单列表
            JSONArray resuArr = JSONObject.parseArray(result.toString());
            log.info(resuArr.get(0).toString());

            // JSONArray 转 list<javaBean>
            List<Gedan> gedanList = resuArr.toJavaList(Gedan.class);
            log.info(gedanList.size() + "张歌单");

            // 把歌单信息存入数据库
            for (Gedan gedan : gedanList) {
                Gedan gedan1 = gedanMapper.selectOne(new LambdaQueryWrapper<Gedan>()
                        .eq(Gedan::getId, gedan.getId())
                );
                if (gedan1 == null){
                    gedanMapper.insert(gedan);
                }
            }
            log.info("歌单数据保存数据库成功");
            return ResponseWrapper.markCustomSuccess("数据保存数据库成功");
        }else {
            log.info("数据获取失败");
            return ResponseWrapper.markCustomError("数据请求失败");
        }
    }

    /**
     * 将歌单列表里的图片下载到本地
     */
    @Override
    public ResponseWrapper downLoadGeDanListPic() {
        ArrayList<String> res = new ArrayList<>();
        List<Gedan> geDanList = this.getGeDanList();
        if (geDanList.size() > 0){
            String path = "E:\\pictures\\wangyiyun-imgs";
            for (Gedan gedan : geDanList) {
                String imgUrl = gedan.getPicUrl();
                String name = gedan.getName();
                try {
                    ImageCodeTool.download(imgUrl,name,path);
                    String message = "歌单图片: " + name + " 下载成功";
                    res.add(message);
                } catch (Exception e) {
                    String message = "歌单图片: " + name + " 下载失败";
                    res.add(message);
                    e.printStackTrace();
                }
            }
            return ResponseWrapper.markCustomSuccess("图片下载完成 \n 本地路径：" + path,res);
        }else {
            return ResponseWrapper.markCustomError("歌单没获取到");
        }
    }

    /**
     * 数据库查询歌单的图片url
     * 根据url下载图片到本地
     */
    @Override
    public ResponseWrapper downLoadGeDanPicByDataBaseQuery() {
        ArrayList<String> res = new ArrayList<>();
        List<Gedan> gedanList = gedanMapper.selectList(null);
        if (gedanList.size() > 0){
            String path = "E:\\pictures\\wangyiyun-imgs\\gedan";
            for (Gedan gedan : gedanList) {
                String name = "歌单图片" + gedan.getId();
                String url = gedan.getPicUrl();
                File file = new File(path + "\\" + name + ".jpg");
                if (file.exists()){
                    res.add(name + ".jpg 已存在");
                }else {
                    try {
                        ImageCodeTool.download(url,name,path);
                        res.add(name + "下载成功");
                    } catch (Exception e) {
                        res.add(name + "下载失败");
                        e.printStackTrace();
                    }
                }
            }
            return ResponseWrapper.markCustomSuccess("歌单图片下载完成，本地路径：" + path,res);
        }else {
            return ResponseWrapper.markCustomError("数据库查询歌单为空");
        }
    }


    /**
     * 将获取歌单，转为list提出来作为一个方法
     */
    public List<Gedan> getGeDanList(){
        // 推荐歌单的请求地址：http://localhost:3000/personalized?limit=
        /*
          推荐歌单
          说明 : 调用此接口 , 可获取推荐歌单

          可选参数 : limit: 取出数量 , 默认为 30 (不支持 offset)

          接口地址 : /personalized

          调用例子 : /personalized?limit=1
         */
        // 获取100个歌单
        String url = "http://localhost:3000/personalized?limit=50";
        String s = HttpUtils.sendGetRequest(url);
        log.info(s);
        // JSON字符串转JSONObject对象
        JSONObject jsonObj = JSONObject.parseObject(s);
        // JSONObject对象转map
        Map<String, Object> map = JSONUtilsTool.JSONObjectToMap(jsonObj);
        log.info(map.toString());

        log.info(map.get("code").toString());
        if (map.get("code").toString().equals("200")) {
            // 200 说明获取数据成功
            Object result = map.get("result");
            log.info(result.toString());
            // 获取到了歌单列表
            JSONArray resuArr = JSONObject.parseArray(result.toString());
            log.info(resuArr.get(0).toString());

            // JSONArray 转 list<javaBean>
            List<Gedan> gedanList = resuArr.toJavaList(Gedan.class);
            log.info(gedanList.size() + "张歌单");
            return gedanList;
        }else {
            return new ArrayList<>();
        }

    }
}
